// 导入token状态
import {
  userInfoStore
} from "/store";

// 请求 基地址
const baseURL = "http://localhost:8080/ccjar/product/"

// 拦截配置
const httpInterceptor = {
  // 拦截前触发
  invoke(options) {
    // 1. 非http开头，需拼接搭配地址
    if (!options.url.startsWith('http')) {
      options.url = baseURL + options.url
    }
    // 2.请求超时
    options.timeout = 100000
    options.header = {
      'source-client': 'miniapp', // 识别来源符号，可加可不加：H5, 小程序-miniapp
    }
    // 3.添加token请求标识
    const userStore = userInfoStore()
    const token = userStore.userInfo?.token
    if (token) {
      options.header.Authorization = token
    }
  },
}

// 拦截request请求
uni.addInterceptor('request', httpInterceptor)
// 拦截uploadFile文件上传
uni.addInterceptor('uploadFile', httpInterceptor)


/**
 * 请求行数
 * @param options
 * @param Promise
 * 1.返回Promise对象，用于处理返回类型
 * 2.获取数据成功，提取核心数据res.data
 * 3.获取数据失败：
 * （1）401错误-》清理用户信息，跳转到登录页
 * （2）其它错误-》根据错误信息提示
 * （3）网络错误-》提示用户换网络
 */

// 2.2 添加类型，支持泛型
export const http = (options) => {
  return new Promise((resolve, reject) => {
    uni.request({
      ...options,
      success(res) {
        // console.log(res.data)
        // console.log(res.data.data.title)
        // console.log(res.statusCode)
        // 状态码2xx，
        if (res.statusCode > 200 && res.statusCode < 300) {
          // 2。1 提取核心数据 res.data
          resolve(res.data)
        } else if (res.statusCode === 401) {
          // 401 
          const userStore = userInfoStore()
          userStore.clearUserInfo()
          uni.reLaunch({ /// navigateTo 带返回；reLaunch不带返回
            url: '/pages/login/login'
          })
          reject(res)
        } else {
          // 其它错误--》后端根据错误信息提示 
          uni.showToast({
            icon: "none",
            title: res.data.msg || '请求错误'
          })
          reject(res)
        }
      },
      fail(err) { // 响应失败
        uni.showToast({
          icon: "none",
          title: '网络错误'
        })
        reject(res)
      }
    })
  }).catch(() => {

  })
}